package com.my.pojo;

import com.alibaba.fastjson.JSON;
import com.my.util.CryptoUtil;
import com.my.util.RSACoder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Transaction {
  /**
   * 交易的唯一标识
   */
  private String id;

  /**
   * 交易输入
   */
  private TransactionInput txIn;

  /**
   * 交易输出
   */
  private TransactionOutput txOut;

  /**
   * 用私钥生成交易签名
   * @param privateKey
   * @param prevTx
   */
  public void sign(String privateKey ,Transaction prevTx){
    if(coinbaseTx()){
      return;
    }

    if(!prevTx.getId().equals(this.getTxIn().getTxId())){
      System.err.println("交易签名失败,当前交易输入引用的前一笔交易与传入的一笔交易不匹配");
    }
    Transaction txClone =cloneTx();

    txClone.getTxIn().setPublicKey(prevTx.getTxOut().getPublicKeyHash());

    String sign ="";
    try {
      sign = RSACoder.sign(txClone.hash().getBytes(),privateKey);
    } catch (Exception e) {
      e.printStackTrace();
    }

    txIn.setSignature(sign);
  }

  /**
   * 用于生成交易签名的交易记录副本
   * @return
   */
  private Transaction cloneTx() {
    TransactionInput transactionInput = new TransactionInput(txIn.getTxId(), txIn.getValue(), null, null);
    TransactionOutput transactionOutput = new TransactionOutput(txOut.getValue(), txOut.getPublicKeyHash());
    // 这个id就是tx3的id
    return new Transaction(id,transactionInput,transactionOutput);
  }

  /**
   *  是否系统生成的区块的奖励交易
   * @return
   */
  private boolean coinbaseTx() {
    return txIn.getTxId().equals("0") && this.getTxIn().getValue()== -1;
  }

  /**
   * 生成交易的hash
   * @return
   */
  public String hash(){
    return CryptoUtil.SHA256(JSON.toJSONString(this));
  }
}
